package edu.ccut.saturn.component.impl.node;

import java.util.List;

import edu.ccut.saturn.component.ComponentManager;
import edu.ccut.saturn.component.ILogicContext;
import edu.ccut.saturn.component.IParameterContext;
import edu.ccut.saturn.component.IParameterInfo;
import edu.ccut.saturn.component.loader.node.NodeInfoLoader;
import edu.ccut.saturn.component.loader.node.StartNodeInfoLoader;
import edu.ccut.saturn.component.xml.ISaturnElement;
import edu.ccut.saturn.component.xml.SaturnElement;

/**
 * 开始结点的实现类。在action组件和logic组件中被调用，表示整个流程的运行起点。 <code>StartNodeInfo</code>扩展了<code>AbstractNodeInfo</code>。
 * 字段autoRollBack表示这个开始结点所在的组件是否支持全局自动事务。
 * <p>
 * 全局自动事务是logic组件的一个属性，在组件开发过程中设置。如果一个logic
 * 组件支持全局自动事务，则这个组件内的所有结点都默认处于统一数据库事务范围之内， 不用手动拖拽事务开始、事务提交、事务回滚结点。
 * 
 * @author 谷钰
 * @author 温建
 * 
 * @version 1.0 2008.8.15
 * 
 * @see AbstractNodeInfo
 * 
 */
public class StartNodeInfo extends AbstractNodeInfo {

	private String autoRollBack;

	public StartNodeInfo(String id, String name, String description, String nextId,
			List<IParameterInfo> parameters, String x, String y) {

		super(id, name, description, nextId, parameters, x, y, "start");
	}

	public StartNodeInfo(String id, String name, String description, String nextId,
			List<IParameterInfo> parameters, String autoRollBack, String x,
			String y) {
		// TODO:id=null?
		super(id, name, description, nextId, parameters, x, y, "start");
		this.autoRollBack = autoRollBack;
	}

	/**
	 * 开始结点的执行逻辑。只是用于标识一个组件的执行起点。
	 * 
	 * @param logicContext
	 *            逻辑上下文对象，记录结点运行时的上下文信息
	 * @throws Exception
	 */
	@Override
	public void doExecute(ILogicContext logicContext) throws Exception {
		ComponentManager.beforeExecuteComponent(this, null);
		ComponentManager.afterExecuteComponent(this, null);
	}

	/**
	 * 获得是否支持全局自动事务的属性的值
	 * 
	 * @return
	 */
	public String getAutoRollBack() {
		return autoRollBack;
	}

	/**
	 * 设置是否支持全局自动事务的属性的值
	 * 
	 * @param autoRollBack
	 */
	public void setAutoRollBack(String autoRollBack) {
		this.autoRollBack = autoRollBack;
	}

	@Override
	protected IParameterContext createParameterContext(
			ILogicContext logicContext) throws Exception {

		return null;
	}

	public ISaturnElement toSaturnElement() {
		ISaturnElement startElement = new SaturnElement(
				StartNodeInfoLoader.KEY_NODETYPE_START);

		startElement.addAttribute(NodeInfoLoader.KEY_NODE_ID, this.getId());
		startElement.addAttribute(NodeInfoLoader.KEY_NODE_NEXT, this
				.getNextId());

		startElement.addAttribute(NodeInfoLoader.KEY_NODE_X, this.getX());
		startElement.addAttribute(NodeInfoLoader.KEY_NODE_Y, this.getY());

		ISaturnElement nameElement = new SaturnElement(
				NodeInfoLoader.KEY_NODE_NAME, this.getName());

		ISaturnElement transactionElement = new SaturnElement(
				StartNodeInfoLoader.KEY_NODE_START_TRANSACTION);

		transactionElement.addAttribute(
				StartNodeInfoLoader.KEY_NODE_START_TRANSACTION_AUTOROLLBACK,
				this.getAutoRollBack());

		ISaturnElement parametersElement = new SaturnElement(
				NodeInfoLoader.KEY_PARAMETER_LIST);

		if (this.getParameterInfos() != null) {

			for (IParameterInfo parameterInfo : this.getParameterInfos()) {
				parametersElement.addSubElement(parameterInfo.toSaturnElement());
			}
		}
		ISaturnElement descriptionElement = new SaturnElement(
				NodeInfoLoader.KEY_NODE_DESCRIPTION, this.getDescription());

		startElement.addSubElement(nameElement);
		startElement.addSubElement(transactionElement);
		startElement.addSubElement(parametersElement);
		startElement.addSubElement(descriptionElement);
		return startElement;
	}
}
